package com.lemzdo.community.controller;

import com.lemzdo.community.dto.AccessTokenDTO;
import com.lemzdo.community.dto.GiteeUserDTO;
import com.lemzdo.community.model.User;
import com.lemzdo.community.provider.GiteeProvider;
import com.lemzdo.community.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

@Controller
public class OAuthLoginController {

    @Autowired//注入giteeProvider
    private GiteeProvider giteeProvider;
    @Autowired
    private UserService userService;

    //注入主配置文件中手写自定义的一些参数
    @Value("${gitee.client.id}")
    private String clientId;
    @Value("${gitee.client.secret}")
    private String clientSecret;
    @Value("${gitee.redirect.uri}")
    private String redirectUri;


    /**
     * 通过点击登录，跳转至gitee，第三方应用回访页面访问login，执行此方法，完成第三方登录的全过程
     * @param code 跳转第三方登录时，gitee传回来的授权码code
     * @param response 上下文根的response 用于创建cookie信息
     * @return 返回到主页面index
     */
    @RequestMapping(value = "/login")
    public String oAuthLogin(@RequestParam(name = "code") String code, HttpServletResponse response) {
        //创建AccessTokenDTO对象，存入所需数据（code等）用于获取access-token
        AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
        accessTokenDTO.setClient_id(clientId);
        accessTokenDTO.setClient_secret(clientSecret);
        accessTokenDTO.setCode(code);
        accessTokenDTO.setRedirect_uri(redirectUri);
        //根据AccessTokenDTO对象（内部的code）获取access-token
        String accessToken = giteeProvider.getAccessToken(accessTokenDTO);
        //根据获取到的access-token来获取一些所需要的用户信息
        GiteeUserDTO giteeUser = giteeProvider.getUser(accessToken);

        //System.out.println("name = "+giteeUser.getName()+",bio = "+giteeUser.getBio()+",id = "+giteeUser.getId());
        //name = lemzdo,bio = ,id = 7574871

        if (giteeUser != null && giteeUser.getId()!=null) {//如果用户不为空，则表示登录成功
            //将guteeUser中的信息存入数据库的model类User中
            User user = new User();
            String token = UUID.randomUUID().toString();//随机uuid作为自定义的token
            user.setToken(token);
            user.setAccountId(String.valueOf(giteeUser.getId()));//id
            user.setName(giteeUser.getName());//name
            user.setAvatarUrl(giteeUser.getAvatarUrl());//获取gitee用户头像作为我们自定义user的头像

            //通过accountId查找数据库，有相同的则更新记录，没有则创建新用户信息
            userService.createOrUpdate(user);

            //手动创建cookie用来绑定每次登陆的信息,以实现持久化登陆状态,创建cookie由response完成，获取由request完成
            response.addCookie(new Cookie("token",token));

            //重定向到index页面，return "index" 只是渲染页面，url栏会有参数显示
            return "redirect:/";

        } else {
            //登录失败，重新登录
            return "redirect:/";
        }
    }


    /**
     *  登出功能，通过移除session中的“user”，
     *  response新建cookie覆盖之前的“token”，设置生命周期为0 来完成
     * @param request 上下文中的request
     * @param response 上下文中的response
     * @return 返回主页面
     */
    @RequestMapping(value = "/logout")
    public String logout(HttpServletRequest request,HttpServletResponse response){
        //移除session中的user
        request.getSession().removeAttribute("user");
        //覆盖cookie中的token 并设置生命周期为0
        Cookie cookie = new Cookie("token",null);
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        return "redirect:/";
    }

}
